/*
 * Copyright(c) 2018-? the original author[Wien(luweien@aliyun.com)] or authors.
 *
 */
package org.doll.it.base.util;

import org.doll.it.base.enums.CodeEnum;
import org.doll.it.base.vo.ResultVO;

/**
 * ResultVO工具类
 * 
 * @author Wien(luweien@aliyun.com)
 *
 */
public class ResultUtils {

	// ---Success---

	/**
	 * 返回成功结果对象
	 * @param data 需要返回的数据
	 * @return
	 */
	public static <T> ResultVO<T> newSuccess(T data) {
		return newInstance(CodeEnum.OK, null, data);
	}

	/**
	 * 返回成功结果对象
	 * @return
	 */
	public static <T> ResultVO<T> newSuccess() {
		return newInstance(CodeEnum.OK, null, null);
	}

	/**
	 * 返回成功结果对象
	 * @param extraMsg 额外的描述
	 * @param data 需要返回的数据
	 * @return
	 */
	public static <T> ResultVO<T> newSuccess(String extraMsg, T data) {
		return newInstance(CodeEnum.OK, extraMsg, data);
	}

	// ---Error---

	/**
	 * 返回一个新的默认错误（500）结果对象
	 * @return
	 */
	public static ResultVO<String> newError() {
		return newError(CodeEnum.INTERNAL_SERVER_ERROR, null, null);
	}

	/**
	 * 返回一个新的默认错误（500）结果对象，并追加额外描述
	 * @param extraMsg 错误额外描述
	 * @return
	 */
	public static ResultVO<String> newError(String extraMsg) {
		return newError(CodeEnum.INTERNAL_SERVER_ERROR, extraMsg, null);
	}

	/**
	 * 返回一个新的错误结果对象，自定义错误类型和额外描述
	 * @param codeEnum 错误枚举
	 * @param extraMsg 错误额外描述
	 * @return
	 */
	public static <T> ResultVO<T> newError(CodeEnum codeEnum, String extraMsg) {
		return newError(codeEnum, extraMsg, null);
	}

	/**
	 * 返回一个新的错误结果对象，自定义错误类型
	 * @param codeEnum 错误枚举
	 * @return
	 */
	public static <T> ResultVO<T> newError(CodeEnum codeEnum) {
		return newError(codeEnum, null, null);
	}

	/**
	 * 回一个新的错误结果对象，自定义错误类型和返回数据
	 * @param codeEnum 错误枚举
	 * @param extraMsg 错误额外描述
	 * @param data 返回数据
	 * @return
	 */
	public static <T> ResultVO<T> newError(CodeEnum codeEnum, String extraMsg, T data) {
		Integer code = ((codeEnum == null) ? null : CodeEnum.ofCode(codeEnum));
		String message = ((codeEnum == null) ? null : CodeEnum.ofMessage(codeEnum, extraMsg));
		return newInstance(code, message, data);
	}

	// ---Common---

	/**
	 * 获取一个新结果对象
	 * @param code 编码
	 * @param message 描述
	 * @param data 结果
	 * @return
	 */
	public static <T> ResultVO<T> newInstance(Integer code, String message, T data) {
		ResultVO<T> resultVO = new ResultVO<T>();
		resultVO.setCode(code);
		resultVO.setMessage(message);
		resultVO.setData(data);
		resultVO.setTimestamp(System.currentTimeMillis());
		return resultVO;
	}

	public static <T> ResultVO<T> newInstance(Integer code, String message) {
		return newInstance(code, message, null);
	}

	public static <T> ResultVO<T> newInstance(CodeEnum codeEnum, String extraMsg, T data) {
		Integer code = ((codeEnum == null) ? null : CodeEnum.ofCode(codeEnum));
		String message = ((codeEnum == null) ? null : CodeEnum.ofMessage(codeEnum, extraMsg));
		return newInstance(code, message, data);
	}

	public static <T> ResultVO<T> newInstance(CodeEnum codeEnum, String extraMsg) {
		return newInstance(codeEnum, extraMsg, null);
	}

	public static <T> ResultVO<T> newInstance(CodeEnum codeEnum) {
		return newInstance(codeEnum, null, null);
	}

}
